/**
 *   Copyright 2011-2015 Quickstep Technologies LLC.
 *   Copyright 2015-2016 Pivotal Software, Inc.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 **/

#include "query_optimizer/QueryProcessor.hpp"

#include <cstdint>
#include <cstdlib>
#include <fstream>
#include <memory>
#include <string>

#include "catalog/Catalog.hpp"
#include "catalog/Catalog.pb.h"
#include "catalog/CatalogDatabase.hpp"
#include "catalog/CatalogRelation.hpp"
#include "parser/ParseStatement.hpp"
#include "query_optimizer/Optimizer.hpp"
#include "query_optimizer/QueryHandle.hpp"
#include "storage/StorageManager.hpp"

using std::ifstream;
using std::ofstream;

namespace quickstep {

QueryHandle* QueryProcessor::generateQueryHandle(const ParseStatement &statement) {
  std::unique_ptr<QueryHandle> query_handle(
      new QueryHandle(query_id_, statement.getPriority()));

  optimizer::Optimizer optimizer(query_id_, getDefaultDatabase(), storage_manager_.get());
  optimizer.generateQueryHandle(statement, query_handle.get());

  if (optimizer.isCatalogChanged() && !catalog_altered_) {
    catalog_altered_ = true;
  }

  ++query_id_;

  return query_handle.release();
}

void QueryProcessor::saveCatalog() {
  if (catalog_altered_) {
    ofstream catalog_file(catalog_filename_.c_str());

    if (!catalog_->getProto().SerializeToOstream(&catalog_file)) {
      throw UnableToWriteCatalog(catalog_filename_);
    }

    catalog_file.close();

    catalog_altered_ = false;
  }
}

void QueryProcessor::loadCatalog() {
  ifstream catalog_file(catalog_filename_.c_str());
  if (!catalog_file.good()) {
    throw UnableToReadCatalog(catalog_filename_);
  }

  serialization::Catalog catalog_proto;
  if (!catalog_proto.ParseFromIstream(&catalog_file)) {
    throw CatalogNotProto(catalog_filename_);
  }
  catalog_file.close();
  catalog_.reset(new Catalog(catalog_proto));

  catalog_altered_ = false;
}

}  // namespace quickstep
