Commit 4344dde6 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

better query interface

parent f323620e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line

rename:
  canvas -> chart
  resultlist -> table

Ways to contribute:
  + report bugs or suggest new features
  + suggest or implement new options for existing charts or new chart types
+5 −2
Original line number Diff line number Diff line
@@ -40,14 +40,17 @@ Query::Query(const char* query_string, query::TableRepository* repo) {
  }
}

bool Query::execute(AbstractResultList* target) {
void Query::execute() {
  for (const auto& stmt : statements_) {
    //target->addHeader(stmt->getColumns());
    //stmt->setTarget(target);
    //stmt->execute();
  }
}

  return true;
ResultList* Query::getResultList(size_t index) const {
  assert(index < results_.size()); // FIXPAUL
  return results_[index].get();
}

/*
+40 −2
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <string>
#include <vector>
#include <memory>
#include "../ui/canvas.h"

namespace fnordmetric {
namespace query {
@@ -17,7 +18,7 @@ class TableRepository;
class DrawStatement;
class ASTNode;
class Executable;
class AbstractResultList;
class ResultList;

class Query {
public:
@@ -26,13 +27,50 @@ public:
  Query& operator=(const Query& copy) = delete;
  Query(Query&& move);

  bool execute(AbstractResultList* target);
  /**
   * Execute the query. This may raise an exception.
   */
  void execute();

  /**
   * Get the number of result lists
   */
  size_t getNumResultLists() const;

  /**
   * Get the nth result list of the query. Raises an exception if no such
   * result list exists
   *
   * The returned pointer is owned by the query instance and must not be freed
   * by the caller!
   *
   * @param index the requested result list index
   */
  ResultList* getResultList(size_t index) const;

  /**
   * Get the number of charts
   */
  size_t getNumChart() const;

  /**
   * Get the nth chart result of the query. Raises an exception if no such
   * chart exists
   *
   * The returned pointer is owned by the query instance and must not be freed
   * by the caller!
   *
   * @param index the requested chart index
   */
  ui::Canvas* getChart(size_t index) const;

protected:
  bool addStatement(ASTNode* statement, TableRepository* repo);

  //Drawable* makeDrawable(query::DrawStatement* stmt);
  std::vector<std::unique_ptr<Executable>> statements_;
  std::vector<std::unique_ptr<ResultList>> results_;
  std::vector<std::unique_ptr<ui::Canvas>> charts_;
};

}
+45 −45
Original line number Diff line number Diff line
@@ -573,18 +573,18 @@ public:
        "    NOT NOT true as three;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumColumns() == 6);
    assert(results.getNumRows() == 1);
    const auto& cols = results.getColumns();
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumColumns() == 6);
    assert(results->getNumRows() == 1);
    const auto& cols = results->getColumns();
    assert(cols[0] == "fnord");
    assert(cols[1] == "fubar");
    assert(cols[2] == "baz");
    assert(cols[3] == "one");
    assert(cols[4] == "two");
    assert(cols[5] == "three");
    const auto& row = results.getRow(0);
    const auto& row = results->getRow(0);
    assert(row[0] == "23");
    assert(row[1] == "256");
    assert(row[2] == "21");
@@ -644,13 +644,13 @@ public:
        "  SELECT one + 50, two FROM testtable",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumColumns() == 2);
    assert(results.getNumRows() == 100);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumColumns() == 2);
    assert(results->getNumRows() == 100);

    for (int i = 0; i<100; ++i) {
      const auto& row = results.getRow(i);
      const auto& row = results->getRow(i);
      assert(atoi(row[0].c_str()) == 51 + i);
      assert(atoi(row[1].c_str()) == 100 - i);
    }
@@ -671,9 +671,9 @@ public:
        "    one > two or one = 3;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 51);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 51);
  }

  void testTableScanWhereLimitQuery() {
@@ -692,10 +692,10 @@ public:
        "  LIMIT 10 OFFSET 5;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 10);
    const auto& row = results.getRow(0);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 10);
    const auto& row = results->getRow(0);
    assert(row[0] == "56");
    assert(row[1] == "46");
  }
@@ -720,9 +720,9 @@ public:
        "    two % 8;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 4);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 4);
  }

  void testTableScanGroupByCountQuery() {
@@ -743,11 +743,11 @@ public:
        "    two % 8;",
        &repo);

    ResultList results;
    query.execute(&results);
    query.execute();
    auto results = query.getResultList(0);
    int sum = 0;
    for (int i = 0; i < results.getNumRows(); ++i) {
      const auto& row = results.getRow(i);
    for (int i = 0; i < results->getNumRows(); ++i) {
      const auto& row = results->getRow(i);
      sum += atoi(row[0].c_str());
    }
    assert(sum == 10);
@@ -768,11 +768,11 @@ public:
        "    three;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 2);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 2);
    for (int i = 0; i<2; ++i) {
      const auto& row = results.getRow(i);
      const auto& row = results->getRow(i);
      assert(
        (atoi(row[0].c_str()) == 25 && atoi(row[1].c_str()) == 100) ||
        (atoi(row[0].c_str()) == 30 && atoi(row[1].c_str()) == 200));
@@ -791,10 +791,10 @@ public:
        "    testtable;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 1);
    assert(results.getRow(0)[0] == "55");
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 1);
    assert(results->getRow(0)[0] == "55");
  }

  void testNamedSeriesQuery() {
@@ -810,12 +810,12 @@ public:
        "      testtable;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 10);
    assert(results.getNumColumns() == 3);
    for (int i = 0; i < results.getNumRows(); ++i) {
      const auto& row = results.getRow(i);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 10);
    assert(results->getNumColumns() == 3);
    for (int i = 0; i < results->getNumRows(); ++i) {
      const auto& row = results->getRow(i);
      assert(row[0] == "myseries");
      assert(atoi(row[1].c_str()) == 10 - i);
      assert(atoi(row[2].c_str()) == 20 - i * 2);
@@ -835,12 +835,12 @@ public:
        "      testtable;",
        &repo);

    ResultList results;
    query.execute(&results);
    assert(results.getNumRows() == 10);
    assert(results.getNumColumns() == 3);
    for (int i = 0; i < results.getNumRows(); ++i) {
      const auto& row = results.getRow(i);
    query.execute();
    auto results = query.getResultList(0);
    assert(results->getNumRows() == 10);
    assert(results->getNumColumns() == 3);
    for (int i = 0; i < results->getNumRows(); ++i) {
      const auto& row = results->getRow(i);
      assert(atoi(row[0].c_str()) == atoi(row[1].c_str()) * 5);
    }
  }