// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.

#ifndef IMPALA_CATALOG_CATALOG_H
#define IMPALA_CATALOG_CATALOG_H

#include <jni.h>

#include "gen-cpp/Frontend_types.h"
#include "gen-cpp/CatalogInternalService_types.h"
#include "gen-cpp/CatalogService_types.h"
#include "common/status.h"

namespace impala {

class CatalogServer;

/// The Catalog is a proxy for the Java-side JniCatalog class. The interface is a set of
/// wrapper functions for methods called over JNI.
class Catalog {
 public:
  /// Does all the work of initialising the JNI method stubs. If any method can't be found,
  /// or if there is any further exception, the constructor will terminate the process.
  Catalog();

  /// Executes the given TDdlExecRequest and returns a response with details on the
  /// result of the operation. Returns OK if the operation was successful,
  /// otherwise a Status object with information on the error will be returned.
  Status ExecDdl(const TDdlExecRequest& req, TDdlExecResponse* resp);

  /// Executes the given TUpdateCatalogRequest and returns a response with details on
  /// the result of the operation. Returns OK if the operation was successful,
  /// otherwise a Status object with information on the error will be returned.
  Status UpdateCatalog(const TUpdateCatalogRequest& req,
      TUpdateCatalogResponse* resp);

  /// Resets the metadata of a single table or the entire catalog, based on the
  /// given TResetMetadataRequest. Returns OK if the operation was successful, otherwise
  /// a Status object with information on the error will be returned.
  Status ResetMetadata(const TResetMetadataRequest& req, TResetMetadataResponse* resp);

  /// Queries the catalog to get the current version and sets the 'version' output
  /// parameter to this value. Returns OK if the operation was successful, otherwise a
  /// Status object with information on the error will be returned.
  Status GetCatalogVersion(long* version);

  /// Retrieves the catalog objects that were added/modified/deleted since version
  /// 'from_version'. Returns OK if the operation was successful, otherwise a Status
  /// object with information on the error will be returned. 'caller' is a pointer to
  /// the caller CatalogServer object. caller->AddTopicUpdate() will be repeatedly
  /// called by the frontend.
  Status GetCatalogDelta(CatalogServer* caller, int64_t from_version,
      TGetCatalogDeltaResponse* resp);

  /// Gets the Thrift representation of a Catalog object. The request is a TCatalogObject
  /// which has the desired TCatalogObjectType and name properly set.
  /// Returns OK if the operation was successful, otherwise a Status object with
  /// information on the error will be returned.
  Status GetCatalogObject(const TCatalogObject& request, TCatalogObject* response);

  /// Return partial information about a Catalog object.
  /// Returns OK if the operation was successful, otherwise a Status object with
  /// information on the error will be returned.
  Status GetPartialCatalogObject(const TGetPartialCatalogObjectRequest& request,
      TGetPartialCatalogObjectResponse* response);

  /// Return all databases matching the optional argument 'pattern'.
  /// If pattern is NULL, match all databases otherwise match only those databases that
  /// match the pattern string. Patterns are "p1|p2|p3" where | denotes choice,
  /// and each pN may contain wildcards denoted by '*' which match all strings.
  /// TODO: GetDbs() and GetTableNames() can probably be scrapped in favor of
  /// GetCatalogDelta(). Consider removing them and moving everything to use
  /// that.
  Status GetDbs(const std::string* pattern, TGetDbsResult* dbs);

  /// Returns all matching table names, per Hive's "SHOW TABLES <pattern>". Each
  /// table name returned is unqualified.
  /// If pattern is NULL, match all tables otherwise match only those tables that
  /// match the pattern string. Patterns are "p1|p2|p3" where | denotes choice,
  /// and each pN may contain wildcards denoted by '*' which match all strings.
  Status GetTableNames(const std::string& db, const std::string* pattern,
      TGetTablesResult* table_names);

  /// Returns the collected metrics of a table. The response contains a
  /// pretty-printed string representation of table metrics.
  Status GetTableMetrics(const std::string& db, const std::string& tbl,
      std::string* metrics);

  /// Returns the Catalog server metrics in the response object. Refer to
  /// TGetCatalogServerMetricsResponse definition for details.
  Status GetCatalogServerMetrics(TGetCatalogServerMetricsResponse* response);

  /// Returns the current catalog usage that includes the most frequently accessed
  /// tables as well as the tables with the highest memory requirements.
  Status GetCatalogUsage(TGetCatalogUsageResponse* response);

  /// Returns the metastore event processor summary view. The summary string
  /// in the response can contain detailed metrics along with status
  Status GetEventProcessorSummary(TEventProcessorMetricsSummaryResponse* response);

  /// Gets all functions in the catalog matching the parameters in the given
  /// TFunctionsRequest.
  Status GetFunctions(const TGetFunctionsRequest& request,
      TGetFunctionsResponse *response);

  /// Prioritizes the loading of metadata for the catalog objects specified in the
  /// TPrioritizeLoadRequest.
  Status PrioritizeLoad(const TPrioritizeLoadRequest& req);

  /// Get partition statistics for the partitions specified in TGetPartitionStatsRequest.
  Status GetPartitionStats(
      const TGetPartitionStatsRequest& req, TGetPartitionStatsResponse* resp);

  /// Checks whether the requesting user has admin privileges on the Sentry Service and
  /// returns OK if they do. Returns a bad status if there was an error executing the
  /// request.
  Status SentryAdminCheck(const TSentryAdminCheckRequest& req,
      TSentryAdminCheckResponse* resp);

  /// Update recently used table names and their use counts in an impalad since the last
  /// report.
  Status UpdateTableUsage(const TUpdateTableUsageRequest& req);

 private:
  /// Descriptor of Java Catalog class itself, used to create a new instance.
  jclass catalog_class_;

  jobject catalog_;  // instance of org.apache.impala.service.JniCatalog
  jmethodID update_metastore_id_;  // JniCatalog.updateMetaastore()
  jmethodID exec_ddl_id_;  // JniCatalog.execDdl()
  jmethodID reset_metadata_id_;  // JniCatalog.resetMetdata()
  jmethodID get_catalog_object_id_;  // JniCatalog.getCatalogObject()
  jmethodID get_partial_catalog_object_id_;  // JniCatalog.getPartialCatalogObject()
  jmethodID get_catalog_delta_id_;  // JniCatalog.getCatalogDelta()
  jmethodID get_catalog_version_id_;  // JniCatalog.getCatalogVersion()
  jmethodID get_catalog_usage_id_; // JniCatalog.getCatalogUsage()
  jmethodID get_catalog_server_metrics_; // JniCatalog.getCatalogServerMetrics()
  jmethodID get_event_processor_summary_; // JniCatalog.getEventProcessorMetrics()
  jmethodID get_dbs_id_; // JniCatalog.getDbs()
  jmethodID get_table_names_id_; // JniCatalog.getTableNames()
  jmethodID get_table_metrics_id_; // JniCatalog.getTableMetrics()
  jmethodID get_functions_id_; // JniCatalog.getFunctions()
  jmethodID get_partition_stats_id_; // JniCatalog.getPartitionStats()
  jmethodID prioritize_load_id_; // JniCatalog.prioritizeLoad()
  jmethodID sentry_admin_check_id_; // JniCatalog.checkUserSentryAdmin()
  jmethodID catalog_ctor_;
  jmethodID update_table_usage_id_;
};

}
#endif
