Commit 59209858 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

read csv header

parent cd9185d8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -87,9 +87,10 @@ TEST_CASE(CSVInputStreamTest, TestReadSimpleRowsEOF, [] () {
});

// CSVTableRefTest
TEST_CASE(CSVInputStreamTest, TestGetColumnIndex, [] () {
TEST_CASE(CSVInputStreamTest, TestGetColumnIndexWithHeaders, [] () {
  CSVTableRef table_ref(
      CSVInputStream::openFile("test/fixtures/gbp_per_country_simple.csv"));
      CSVInputStream::openFile("test/fixtures/gbp_per_country_simple.csv"),
      true);

  EXPECT_EQ(table_ref.getColumnIndex("country"), 0);
});
+31 −2
Original line number Diff line number Diff line
@@ -8,21 +8,50 @@
#include <fnordmetric/query/backends/csv/csvtableref.h>
#include <fnordmetric/query/backends/csv/csvinputstream.h>
#include <fnordmetric/query/tableref.h>
#include <fnordmetric/util/runtimeexception.h>

namespace fnordmetric {
namespace query {
namespace csv_backend {

CSVTableRef::CSVTableRef(
    std::unique_ptr<CSVInputStream>&& csv) :
    csv_(std::move(csv)) {}
    std::unique_ptr<CSVInputStream>&& csv,
    bool headers /* = false */) :
    csv_(std::move(csv)),
    num_cols_(-1) {
  if (headers) {
    readHeaders();
  }
}

int CSVTableRef::getColumnIndex(const std::string& name) {
  const auto& header = headers_.find(name);

  if (header != headers_.end()) {
    return header->second;
  }

  return -1;
}

void CSVTableRef::executeScan(TableScan* scan) {
}

void CSVTableRef::readHeaders() {
  std::vector<std::string> headers;

  if (!csv_->readNextRow(&headers) || headers.size() == 0) {
    RAISE(util::RuntimeException, "no headers found in CSV file"); // FIXPAUL filename
  }

  size_t col_index = 0;
  for (const auto& header : headers) {
    headers_.emplace(header, col_index++);
  }

  num_cols_ = col_index;
}

}
}
}
+16 −1
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@
#ifndef _FNORDMETRIC_CSVTABLEREF_H
#define _FNORDMETRIC_CSVTABLEREF_H
#include <memory>
#include <unordered_map>
#include <string>
#include <fnordmetric/query/backends/csv/csvinputstream.h>
#include <fnordmetric/query/tableref.h>

@@ -14,13 +16,26 @@ namespace fnordmetric {
namespace query {
namespace csv_backend {

/**
 * A CSVTableRef instance is threadfriendly but not threadsafe. You must
 * synchronize access to all methods.
 */
class CSVTableRef : public TableRef {
public:
  CSVTableRef(std::unique_ptr<CSVInputStream>&& csv);
  CSVTableRef(
      std::unique_ptr<CSVInputStream>&& csv,
      bool headers = false);

  int getColumnIndex(const std::string& name) override;
  void executeScan(TableScan* scan) override;

protected:

  void readHeaders();

  std::unordered_map<std::string, size_t> headers_;
  std::unique_ptr<CSVInputStream> csv_;
  int num_cols_;
};

}