Commit 25dcac1b authored by Paul Asmuth's avatar Paul Asmuth
Browse files

re-add data_load_csv

parent bbb8b767
Loading
Loading
Loading
Loading
+121 −20
Original line number Diff line number Diff line
@@ -12,6 +12,10 @@
 * limitations under the License.
 */
#include "data.h"
#include "utils/fileutil.h"
#include "utils/csv.h"
#include "sexpr_conv.h"
#include "sexpr_util.h"
#include <assert.h>
#include <iostream>

@@ -83,26 +87,6 @@ std::vector<DataGroup> series_group(const Series& data) {
  return groups;
}

std::vector<Color> series_to_colors(
    SeriesRef series,
    const ScaleConfig& domain_config,
    const ColorScheme& palette) {
  if (!series) {
    return {};
  }

  auto domain = domain_config;
  //domain_fit(*series, &domain);

  std::vector<Color> colors;
  //for (const auto& v : *series) {
  //  auto value = domain_translate(domain, v) * domain_cardinality(domain);
  //  colors.emplace_back(palette.get(value));
  //}

  return colors;
}

std::vector<Color> groups_to_colors(
    size_t count,
    const std::vector<DataGroup>& groups,
@@ -119,5 +103,122 @@ std::vector<Color> groups_to_colors(
  return colors;
}

ReturnCode data_load_strings_csv(
    const Expr* expr,
    std::vector<std::string>* values) {
  auto args = expr_collect(expr);
  if (args.size() != 2 ||
      !expr_is_value(args[0]) ||
      !expr_is_value(args[1])) {
    return ReturnCode::errorf(
        "EARG",
        "invalid number of arguments to 'csv'; expected: 2, got: $0",
        "..."); // FIXME
  }


  const auto& path = expr_get_value(args[0]);
  const auto& column_name = expr_get_value(args[1]);

  std::string data_str;
  if (auto rc = read_file(path, &data_str); !rc) {
    return rc;
  }

  auto data_csv = CSVData{};
  CSVParserConfig parser_opts;
  if (auto rc = parseCSV(data_str, parser_opts, &data_csv); !rc) {
    return rc;
  }

  if (data_csv.empty()) {
    return OK;
  }

  const auto& headers = data_csv.front();
  const auto& header = std::find(headers.begin(), headers.end(), column_name);
  if (header == headers.end()) {
    return ReturnCode::errorf(
        "EARG",
        "CSV column not found: $0",
        column_name);
  }

  auto column_idx = std::distance(headers.begin(), header);
  for (auto row = ++data_csv.begin(); row != data_csv.end(); ++row) {
    if (row->size() < column_idx) {
      return ReturnCode::errorf(
          "EARG",
          "CSV invalid number of columns for row #$0",
          std::distance(data_csv.begin(), row));
    }

    values->push_back(row->at(column_idx));
  }

  return OK;
}

ReturnCode data_load_csv(
    const Expr* expr,
    std::vector<Measure>* values) {
  std::vector<std::string> values_str;
  if (auto rc = data_load_strings_csv(expr, &values_str); !rc) {
    return rc;
  }

  for (auto v = values_str.begin(); v != values_str.end(); ++v) {
    try {
      values->push_back(from_user(std::stod(*v)));
    } catch (... ) {
      return ReturnCode::errorf(
          "EARG",
          "CSV invalid column in row #$0: '$1' is not a number",
          std::distance(values_str.begin(), v) + 1,
          *v);
    }
  }

  return OK;
}

ReturnCode data_load_strings(
    const Expr* expr,
    std::vector<std::string>* values) {
  if (!expr || !expr_is_list(expr)) {
    return ReturnCode::errorf(
        "EARG",
        "argument error; expected a value, got: $0",
        "..."); // FIXME
  }

  auto args = expr_get_list(expr);

  if (args && expr_is_value_literal(args, "csv")) {
    return data_load_strings_csv(expr_next(args), values);
  }

  return expr_to_strings(expr, values);
}

ReturnCode data_load(
    const Expr* expr,
    std::vector<Measure>* values) {
  if (!expr || !expr_is_list(expr)) {
    return ReturnCode::errorf(
        "EARG",
        "argument error; expected a value, got: $0",
        "..."); // FIXME
  }

  auto args = expr_get_list(expr);

  if (args && expr_is_value_literal(args, "csv")) {
    return data_load_csv(expr_next(args), values);
  }

  return expr_to_measures(expr, values);
}

} // namespace fviz
+8 −0
Original line number Diff line number Diff line
@@ -57,5 +57,13 @@ std::vector<Measure> series_to_sizes(
    const Measure& low,
    const Measure& high);

ReturnCode data_load_strings(
    const Expr* expr,
    std::vector<std::string>* values);

ReturnCode data_load(
    const Expr* expr,
    std::vector<Measure>* values);

} // namespace fviz
+5 −4
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
 */
#include "areas.h"

#include "data.h"
#include "environment.h"
#include "layout.h"
#include "scale.h"
@@ -219,10 +220,10 @@ ReturnCode build(

  /* parse properties */
  auto config_rc = expr_walk_map(expr_next(expr), {
    {"xdata", bind(&expr_to_measures, _1, &config->x)},
    {"ydata", bind(&expr_to_measures, _1, &config->y)},
    {"xoffsetdata", bind(&expr_to_measures, _1, &config->xoffset)},
    {"yoffsetdata", bind(&expr_to_measures, _1, &config->yoffset)},
    {"xdata", bind(&data_load, _1, &config->x)},
    {"ydata", bind(&data_load, _1, &config->y)},
    {"xoffsetdata", bind(&data_load, _1, &config->xoffset)},
    {"yoffsetdata", bind(&data_load, _1, &config->yoffset)},
    {"xmin", bind(&expr_to_float64_opt, _1, &config->scale_x.min)},
    {"xmax", bind(&expr_to_float64_opt, _1, &config->scale_x.max)},
    {"xscale", bind(&scale_configure_kind, _1, &config->scale_x)},
+3 −1
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
 * limitations under the License.
 */
#include "axis.h"

#include "data.h"
#include "environment.h"
#include "graphics/text.h"
#include "graphics/layout.h"
@@ -535,7 +537,7 @@ ReturnCode build(const Environment& env, const Expr* expr, ElementRef* elem) {
      {"max", bind(&expr_to_float64_opt, _1, &config->scale.max)},
      {"scale", bind(&scale_configure_kind, _1, &config->scale)},
      {"scale-padding", bind(&expr_to_float64, _1, &config->scale.padding)},
      {"labels", bind(&expr_to_strings, _1, &config->label_override)},
      {"labels", bind(&data_load_strings, _1, &config->label_override)},
    });

    if (!rc) {
+8 −7
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
 */
#include "bars.h"

#include "data.h"
#include "environment.h"
#include "layout.h"
#include "graphics/path.h"
@@ -321,10 +322,10 @@ ReturnCode build(

  /* parse properties */
  auto config_rc = expr_walk_map(expr_next(expr), {
    {"xdata", bind(&expr_to_measures, _1, &config->x)},
    {"ydata", bind(&expr_to_measures, _1, &config->y)},
    {"xoffsetdata", bind(&expr_to_measures, _1, &config->xoffset)},
    {"yoffsetdata", bind(&expr_to_measures, _1, &config->yoffset)},
    {"xdata", bind(&data_load, _1, &config->x)},
    {"ydata", bind(&data_load, _1, &config->y)},
    {"xoffsetdata", bind(&data_load, _1, &config->xoffset)},
    {"yoffsetdata", bind(&data_load, _1, &config->yoffset)},
    {"xmin", bind(&expr_to_float64_opt, _1, &config->scale_x.min)},
    {"xmax", bind(&expr_to_float64_opt, _1, &config->scale_x.max)},
    {"xscale", bind(&scale_configure_kind, _1, &config->scale_x)},
@@ -333,8 +334,8 @@ ReturnCode build(
    {"ymax", bind(&expr_to_float64_opt, _1, &config->scale_y.max)},
    {"yscale", bind(&scale_configure_kind, _1, &config->scale_y)},
    {"yscale-padding", bind(&expr_to_float64, _1, &config->scale_y.padding)},
    {"size", bind(&expr_to_measures, _1, &config->sizes)},
    {"sizes", bind(&expr_to_measures, _1, &config->sizes)},
    {"size", bind(&data_load, _1, &config->sizes)},
    {"sizes", bind(&data_load, _1, &config->sizes)},
    {
      "direction",
      expr_to_enum_fn<Direction>(&config->direction, {
@@ -344,7 +345,7 @@ ReturnCode build(
    },
    {"color", expr_tov_fn<Color>(bind(&expr_to_color, _1, _2), &config->colors)},
    {"colors", expr_tov_fn<Color>(bind(&expr_to_color, _1, _2), &config->colors)},
    {"labels", bind(&expr_to_strings, _1, &config->labels)},
    {"labels", bind(&data_load_strings, _1, &config->labels)},
  });

  if (!config_rc) {
Loading