Skip to content

Commit

Permalink
GDV-82:[Java][CPP]Export supported types from Gandiva. (apache#66)
Browse files Browse the repository at this point in the history
Exporting supported data types and functions from Gandiva.
Added a JNI bridge to access this from the java layer.
  • Loading branch information
praveenbingo committed Sep 10, 2018
1 parent 33b0083 commit 60acb88
Show file tree
Hide file tree
Showing 16 changed files with 557 additions and 51 deletions.
20 changes: 12 additions & 8 deletions cpp/src/gandiva/codegen/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,19 @@ set(BC_FILE_PATH_CC "${CMAKE_CURRENT_BINARY_DIR}/bc_file_path.cc")
configure_file(bc_file_path.cc.in ${BC_FILE_PATH_CC})

set(SRC_FILES annotator.cc
engine.cc
bitmap_accumulator.cc
configuration.cc
engine.cc
expr_decomposer.cc
expr_validator.cc
expression.cc
expression_registry.cc
function_registry.cc
function_signature.cc
llvm_generator.cc
llvm_types.cc
projector.cc
status.cc
expression.cc
tree_expr_builder.cc
${BC_FILE_PATH_CC})

Expand Down Expand Up @@ -81,11 +83,13 @@ install(
add_gandiva_unit_test(bitmap_accumulator_test.cc bitmap_accumulator.cc)
add_gandiva_unit_test(dex_llvm_test.cc)
add_gandiva_unit_test(engine_llvm_test.cc engine.cc llvm_types.cc status.cc configuration.cc ${BC_FILE_PATH_CC})
add_gandiva_unit_test(function_signature_test.cc)
add_gandiva_unit_test(function_registry_test.cc function_registry.cc)
add_gandiva_unit_test(function_signature_test.cc function_signature.cc)
add_gandiva_unit_test(function_registry_test.cc function_registry.cc function_signature.cc)
add_gandiva_unit_test(llvm_types_test.cc llvm_types.cc)
add_gandiva_unit_test(llvm_generator_test.cc llvm_generator.cc engine.cc llvm_types.cc expr_decomposer.cc function_registry.cc annotator.cc status.cc bitmap_accumulator.cc configuration.cc ${BC_FILE_PATH_CC})
add_gandiva_unit_test(annotator_test.cc annotator.cc)
add_gandiva_unit_test(tree_expr_test.cc tree_expr_builder.cc expr_decomposer.cc annotator.cc function_registry.cc)
add_gandiva_unit_test(expr_decomposer_test.cc expr_decomposer.cc tree_expr_builder.cc annotator.cc function_registry.cc)
add_gandiva_unit_test(llvm_generator_test.cc llvm_generator.cc engine.cc llvm_types.cc expr_decomposer.cc function_registry.cc annotator.cc status.cc bitmap_accumulator.cc configuration.cc function_signature.cc ${BC_FILE_PATH_CC})
add_gandiva_unit_test(annotator_test.cc annotator.cc function_signature.cc)
add_gandiva_unit_test(tree_expr_test.cc tree_expr_builder.cc expr_decomposer.cc annotator.cc function_registry.cc function_signature.cc)
add_gandiva_unit_test(expr_decomposer_test.cc expr_decomposer.cc tree_expr_builder.cc annotator.cc function_registry.cc function_signature.cc)
add_gandiva_unit_test(status_test.cc status.cc)
add_gandiva_unit_test(expression_registry_test.cc llvm_types.cc expression_registry.cc function_signature.cc function_registry.cc)

2 changes: 1 addition & 1 deletion cpp/src/gandiva/codegen/expr_decomposer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
#include "codegen/annotator.h"
#include "codegen/dex.h"
#include "codegen/function_registry.h"
#include "codegen/function_signature.h"
#include "codegen/node.h"
#include "gandiva/function_signature.h"

namespace gandiva {

Expand Down
2 changes: 1 addition & 1 deletion cpp/src/gandiva/codegen/expr_decomposer_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@
#include "codegen/annotator.h"
#include "codegen/dex.h"
#include "codegen/function_registry.h"
#include "codegen/function_signature.h"
#include "codegen/node.h"
#include "gandiva/function_signature.h"
#include "gandiva/gandiva_aliases.h"
#include "gandiva/tree_expr_builder.h"

Expand Down
151 changes: 151 additions & 0 deletions cpp/src/gandiva/codegen/expression_registry.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
// Copyright (C) 2017-2018 Dremio Corporation
//
// 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 "gandiva/expression_registry.h"

#include "boost/iterator/transform_iterator.hpp"

#include "codegen/function_registry.h"
#include "codegen/llvm_types.h"

namespace gandiva {

ExpressionRegistry::ExpressionRegistry() {
function_registry_.reset(new FunctionRegistry());
}

ExpressionRegistry::~ExpressionRegistry() {}

const ExpressionRegistry::FunctionSignatureIterator
ExpressionRegistry::function_signature_begin() {
return FunctionSignatureIterator(function_registry_->begin(),
function_registry_->end());
}

const ExpressionRegistry::FunctionSignatureIterator
ExpressionRegistry::function_signature_end() const {
return FunctionSignatureIterator(function_registry_->end(), function_registry_->end());
}

bool ExpressionRegistry::FunctionSignatureIterator::operator!=(
const FunctionSignatureIterator &func_sign_it) {
return func_sign_it.it != this->it;
}

FunctionSignature ExpressionRegistry::FunctionSignatureIterator::operator*() {
return (*it).signature();
}

ExpressionRegistry::iterator ExpressionRegistry::FunctionSignatureIterator::operator++(
int increment) {
return it++;
}

DataTypeVector ExpressionRegistry::supported_types_ =
ExpressionRegistry::InitSupportedTypes();

DataTypeVector ExpressionRegistry::InitSupportedTypes() {
DataTypeVector data_type_vector;
llvm::LLVMContext llvm_context;
LLVMTypes llvm_types(llvm_context);
auto supported_arrow_types = llvm_types.GetSupportedArrowTypes();
for (auto &type_id : supported_arrow_types) {
AddArrowTypesToVector(type_id, data_type_vector);
}
return data_type_vector;
}

void ExpressionRegistry::AddArrowTypesToVector(arrow::Type::type &type,
DataTypeVector &vector) {
switch (type) {
case arrow::Type::type::BOOL:
vector.push_back(arrow::boolean());
break;
case arrow::Type::type::UINT8:
vector.push_back(arrow::uint8());
break;
case arrow::Type::type::INT8:
vector.push_back(arrow::int8());
break;
case arrow::Type::type::UINT16:
vector.push_back(arrow::uint16());
break;
case arrow::Type::type::INT16:
vector.push_back(arrow::int16());
break;
case arrow::Type::type::UINT32:
vector.push_back(arrow::uint32());
break;
case arrow::Type::type::INT32:
vector.push_back(arrow::int32());
break;
case arrow::Type::type::UINT64:
vector.push_back(arrow::uint64());
break;
case arrow::Type::type::INT64:
vector.push_back(arrow::int64());
break;
case arrow::Type::type::HALF_FLOAT:
vector.push_back(arrow::float16());
break;
case arrow::Type::type::FLOAT:
vector.push_back(arrow::float32());
break;
case arrow::Type::type::DOUBLE:
vector.push_back(arrow::float64());
break;
case arrow::Type::type::STRING:
vector.push_back(arrow::utf8());
break;
case arrow::Type::type::BINARY:
vector.push_back(arrow::binary());
break;
case arrow::Type::type::DATE32:
vector.push_back(arrow::date32());
break;
case arrow::Type::type::DATE64:
vector.push_back(arrow::date64());
break;
case arrow::Type::type::TIMESTAMP:
vector.push_back(arrow::timestamp(arrow::TimeUnit::SECOND));
vector.push_back(arrow::timestamp(arrow::TimeUnit::MILLI));
vector.push_back(arrow::timestamp(arrow::TimeUnit::NANO));
vector.push_back(arrow::timestamp(arrow::TimeUnit::MICRO));
break;
case arrow::Type::type::TIME32:
vector.push_back(arrow::time32(arrow::TimeUnit::SECOND));
vector.push_back(arrow::time32(arrow::TimeUnit::MILLI));
break;
case arrow::Type::type::TIME64:
vector.push_back(arrow::time64(arrow::TimeUnit::MICRO));
vector.push_back(arrow::time64(arrow::TimeUnit::NANO));
break;
case arrow::Type::type::NA:
vector.push_back(arrow::null());
break;
case arrow::Type::type::FIXED_SIZE_BINARY:
case arrow::Type::type::MAP:
case arrow::Type::type::INTERVAL:
case arrow::Type::type::DECIMAL:
case arrow::Type::type::LIST:
case arrow::Type::type::STRUCT:
case arrow::Type::type::UNION:
case arrow::Type::type::DICTIONARY:
// un-supported types. test ensures that
// when one of these are added build breaks.
DCHECK(false);
}
}

} // namespace gandiva
64 changes: 64 additions & 0 deletions cpp/src/gandiva/codegen/expression_registry.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Copyright (C) 2017-2018 Dremio Corporation
*
* 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.
*/
#ifndef GANDIVA_TYPES_H
#define GANDIVA_TYPES_H

#include <memory>
#include <vector>

#include "gandiva/arrow.h"
#include "gandiva/function_signature.h"
#include "gandiva/gandiva_aliases.h"

namespace gandiva {

class NativeFunction;
class FunctionRegistry;
/// \brief Exports types supported by Gandiva for processing.
///
/// Has helper methods for clients to programatically discover
/// data types and functions supported by Gandiva.
class ExpressionRegistry {
public:
using iterator = const NativeFunction *;
ExpressionRegistry();
~ExpressionRegistry();
static DataTypeVector supported_types() { return supported_types_; }
class FunctionSignatureIterator {
public:
FunctionSignatureIterator(iterator begin, iterator end) : it(begin), end(end) {}

bool operator!=(const FunctionSignatureIterator &func_sign_it);

FunctionSignature operator*();

iterator operator++(int);

private:
iterator it;
iterator end;
};
const FunctionSignatureIterator function_signature_begin();
const FunctionSignatureIterator function_signature_end() const;

private:
static DataTypeVector supported_types_;
static DataTypeVector InitSupportedTypes();
static void AddArrowTypesToVector(arrow::Type::type &type, DataTypeVector &vector);
std::unique_ptr<FunctionRegistry> function_registry_;
};
} // namespace gandiva
#endif // GANDIVA_TYPES_H
64 changes: 64 additions & 0 deletions cpp/src/gandiva/codegen/expression_registry_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
// Copyright (C) 2017-2018 Dremio Corporation
//
// 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 "gandiva/expression_registry.h"

#include <algorithm>
#include <vector>

#include <gtest/gtest.h>
#include "codegen/function_registry.h"
#include "codegen/llvm_types.h"
#include "gandiva/function_signature.h"

namespace gandiva {

typedef int64_t (*add_vector_func_t)(int64_t *elements, int nelements);

class TestExpressionRegistry : public ::testing::Test {
protected:
FunctionRegistry registry_;
};

// Verify all functions in registry are exported.
TEST_F(TestExpressionRegistry, VerifySupportedFunctions) {
std::vector<FunctionSignature> functions;
ExpressionRegistry expr_registry;
for (auto iter = expr_registry.function_signature_begin();
iter != expr_registry.function_signature_end(); iter++) {
functions.push_back((*iter));
}
for (auto &iter : registry_) {
auto function = iter.signature();
auto element = std::find(functions.begin(), functions.end(), function);
EXPECT_NE(element, functions.end())
<< "function " << iter.pc_name() << " missing in supported functions.\n";
}
}

// Verify all types are supported.
TEST_F(TestExpressionRegistry, VerifyDataTypes) {
DataTypeVector data_types = ExpressionRegistry::supported_types();
llvm::LLVMContext llvm_context;
LLVMTypes llvm_types(llvm_context);
auto supported_arrow_types = llvm_types.GetSupportedArrowTypes();
for (auto &type_id : supported_arrow_types) {
auto element =
std::find(supported_arrow_types.begin(), supported_arrow_types.end(), type_id);
EXPECT_NE(element, supported_arrow_types.end())
<< "data type " << type_id << " missing in supported data types.\n";
}
}

} // namespace gandiva
1 change: 1 addition & 0 deletions cpp/src/gandiva/codegen/function_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <unordered_map>

#include "codegen/native_function.h"
#include "gandiva/gandiva_aliases.h"

namespace gandiva {

Expand Down
Loading

0 comments on commit 60acb88

Please sign in to comment.