summaryrefslogtreecommitdiffstats
path: root/src/spreadsheet/factory_pivot.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/spreadsheet/factory_pivot.hpp')
-rw-r--r--src/spreadsheet/factory_pivot.hpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/spreadsheet/factory_pivot.hpp b/src/spreadsheet/factory_pivot.hpp
new file mode 100644
index 0000000..465fef1
--- /dev/null
+++ b/src/spreadsheet/factory_pivot.hpp
@@ -0,0 +1,120 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_ORCUS_SPREADSHEET_FACTORY_PIVOT_HPP
+#define INCLUDED_ORCUS_SPREADSHEET_FACTORY_PIVOT_HPP
+
+#include "orcus/spreadsheet/pivot.hpp"
+#include "orcus/spreadsheet/document.hpp"
+#include "orcus/spreadsheet/import_interface_pivot.hpp"
+
+#include <ixion/formula_name_resolver.hpp>
+
+namespace orcus { namespace spreadsheet {
+
+class import_pc_field_group;
+
+/**
+ * Concrete implementation of the import_pivot_cache_definition interface.
+ */
+class import_pivot_cache_def : public iface::import_pivot_cache_definition
+{
+ enum source_type { unknown = 0, worksheet, external, consolidation, scenario };
+
+ document& m_doc;
+
+ pivot_cache_id_t m_cache_id = 0;
+
+ source_type m_src_type = unknown;
+ std::string_view m_src_sheet_name;
+ ixion::abs_range_t m_src_range;
+ std::string_view m_src_table_name;
+
+ std::unique_ptr<pivot_cache> m_cache;
+ pivot_cache::fields_type m_current_fields;
+ pivot_cache_field_t m_current_field;
+ pivot_cache_item_t m_current_field_item;
+
+ std::unique_ptr<import_pc_field_group> m_current_field_group;
+
+private:
+ std::string_view intern(std::string_view s);
+
+public:
+ import_pivot_cache_def(document& doc);
+ ~import_pivot_cache_def();
+
+ void create_cache(pivot_cache_id_t cache_id);
+
+ virtual void set_worksheet_source(std::string_view ref, std::string_view sheet_name) override;
+
+ virtual void set_worksheet_source(std::string_view table_name) override;
+
+ virtual void set_field_count(size_t n) override;
+
+ virtual void set_field_name(std::string_view name) override;
+
+ virtual iface::import_pivot_cache_field_group* start_field_group(size_t base_index) override;
+
+ virtual void set_field_min_value(double v) override;
+
+ virtual void set_field_max_value(double v) override;
+
+ virtual void set_field_min_date(const date_time_t& dt) override;
+
+ virtual void set_field_max_date(const date_time_t& dt) override;
+
+ virtual void commit_field() override;
+
+ virtual void set_field_item_string(std::string_view value) override;
+
+ virtual void set_field_item_numeric(double v) override;
+
+ virtual void set_field_item_date_time(const date_time_t& dt) override;
+
+ virtual void set_field_item_error(error_value_t ev) override;
+
+ virtual void commit_field_item() override;
+
+ virtual void commit() override;
+};
+
+/**
+ * Concrete implementation of the import_pivot_cache_records interface.
+ */
+class import_pivot_cache_records : public iface::import_pivot_cache_records
+{
+ document& m_doc;
+ pivot_cache* m_cache; //< cache to push the records to at the very end.
+
+ pivot_cache_record_t m_current_record;
+ pivot_cache::records_type m_records;
+
+public:
+ import_pivot_cache_records(document& doc);
+ ~import_pivot_cache_records();
+
+ void set_cache(pivot_cache* p);
+
+ virtual void set_record_count(size_t n) override;
+
+ virtual void append_record_value_numeric(double v) override;
+
+ virtual void append_record_value_character(std::string_view s) override;
+
+ virtual void append_record_value_shared_item(size_t index) override;
+
+ virtual void commit_record() override;
+
+ virtual void commit() override;
+};
+
+}}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */