blob: 6684a6c35b4c222fb48264237b329447f0120eea [file]
// 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.
#pragma once
#include "common/status.h"
#include "runtime/descriptors.h"
#include <jni.h>
#include <string>
#include <arrow/c/bridge.h>
namespace impala {
class RuntimeState;
/// Adapter class of the FE PaimonJniScanner, wraps the JNI calls as C++ methods.
class PaimonJniScanner {
public:
PaimonJniScanner(const std::string& scan_param, const TupleDescriptor* tuple_desc,
const std::string& table_name);
/// JNI setup. Creates global references for Java classes and finds method ids.
/// Initializes static members, should be called once per process lifecycle.
static Status InitJNI() WARN_UNUSED_RESULT;
// Initializes this object, creates the java metadata scanner object.
Status Init(JNIEnv* env) WARN_UNUSED_RESULT;
/// Executes an Paimon scan through JNI.
Status ScanTable(JNIEnv* env) WARN_UNUSED_RESULT;
/// Gets the next arrow batch from 'org.apache.impala.util.paimon.PaimonJniScanner'.
Status GetNextBatchDirect(JNIEnv* env, struct ArrowArray** array,
struct ArrowSchema** schema, long* rows, long* offheap_used) WARN_UNUSED_RESULT;
/// Removes global references.
void Close(RuntimeState* state);
private:
/// Global class references created with JniUtil.
inline static jclass paimon_jni_scanner_cl_ = nullptr;
/// Method references created with JniUtil.
inline static jmethodID paimon_jni_scanner_ctor_ = nullptr;
inline static jmethodID paimon_jni_scanner_scan_table_ = nullptr;
inline static jmethodID paimon_jni_scanner_get_next_ = nullptr;
inline static jmethodID paimon_jni_scanner_close_ = nullptr;
/// The Paimon table scan parameters.
const std::string& paimon_scan_param_;
/// Top level TupleDescriptor.
const TupleDescriptor* tuple_desc_;
/// metastore table name
const std::string& table_name_;
/// Paimon scanner Java object, it helps preparing the table and
/// executes an Paimon table scan. Allows the ScanNode to fetch the row batch from
/// the Java Off Heap.
jobject j_jni_scanner_;
std::string DebugString();
};
} // namespace impala