21 namespace spatial_type {
30 size_t size() const final {
return 1; }
36 const std::vector<llvm::Value*>& arg_lvs,
37 const std::vector<llvm::Value*>& pos_lvs,
42 const auto& geo_ti = operand->get_type_info();
43 CHECK(geo_ti.is_geometry());
44 auto& builder = cgen_state->ir_builder_;
46 llvm::Value* array_buff_ptr{
nullptr};
48 if (arg_lvs.size() == 1) {
49 if (dynamic_cast<const Analyzer::GeoExpr*>(operand)) {
51 llvm::dyn_cast<llvm::PointerType>(arg_lvs.front()->getType());
53 const auto is_null_lv =
54 builder.CreateICmp(llvm::CmpInst::ICMP_EQ,
56 llvm::ConstantPointerNull::get(ptr_type));
57 return std::make_tuple(arg_lvs, is_null_lv);
61 arg_lvs.front(), pos_lvs.front(), geo_ti, cgen_state);
62 array_buff_ptr = arr_load_lvs.
buffer;
67 if (dynamic_cast<const Analyzer::GeoOperator*>(operand)) {
70 llvm::CmpInst::ICMP_EQ,
72 llvm::ConstantPointerNull::get(
74 ? llvm::Type::getInt32PtrTy(cgen_state->context_)
75 : llvm::Type::getDoublePtrTy(cgen_state->context_)));
79 array_buff_ptr = arg_lvs.front();
85 return std::make_tuple(std::vector<llvm::Value*>{array_buff_ptr},
is_null);
88 std::vector<llvm::Value*>
codegen(
const std::vector<llvm::Value*>&
args,
93 const auto array_buff_ptr =
args.front();
96 CHECK(geo_ti.is_geometry());
97 auto& builder = cgen_state->ir_builder_;
100 const std::string expr_name = is_x ?
"x" :
"y";
102 llvm::Value* coord_lv;
104 auto compressed_arr_ptr = builder.CreateBitCast(
105 array_buff_ptr, llvm::Type::getInt32PtrTy(cgen_state->context_));
106 auto coord_index = is_x ? cgen_state->llInt(0) : cgen_state->llInt(1);
107 auto coord_lv_ptr = builder.CreateGEP(
108 compressed_arr_ptr->getType()->getScalarType()->getPointerElementType(),
111 expr_name +
"_coord_ptr");
112 auto compressed_coord_lv =
113 builder.CreateLoad(coord_lv_ptr->getType()->getPointerElementType(),
115 expr_name +
"_coord_compressed");
118 cgen_state->emitExternalCall(
"decompress_" + expr_name +
"_coord_geoint",
119 llvm::Type::getDoubleTy(cgen_state->context_),
120 {compressed_coord_lv});
122 auto coord_arr_ptr = builder.CreateBitCast(
123 array_buff_ptr, llvm::Type::getDoublePtrTy(cgen_state->context_));
124 auto coord_index = is_x ? cgen_state->llInt(0) : cgen_state->llInt(1);
125 auto coord_lv_ptr = builder.CreateGEP(
126 coord_arr_ptr->getType()->getScalarType()->getPointerElementType(),
129 expr_name +
"_coord_ptr");
130 coord_lv = builder.CreateLoad(coord_lv_ptr->getType()->getPointerElementType(),
132 expr_name +
"_coord");
137 CHECK(nullcheck_codegen);
142 CHECK(cgen_state->geo_target_cache_.insert(std::make_pair(key, ret)).second);
PointAccessors(const Analyzer::GeoOperator *geo_operator)
size_t size() const final
CONSTEXPR DEVICE bool is_null(const T &value)
const std::string & getName() const
std::tuple< std::vector< llvm::Value * >, llvm::Value * > codegenLoads(const std::vector< llvm::Value * > &arg_lvs, const std::vector< llvm::Value * > &pos_lvs, CgenState *cgen_state) final
SQLTypeInfo getNullType() const final
const SQLTypeInfo & get_type_info() const
static ArrayLoadCodegen codegenGeoArrayLoadAndNullcheck(llvm::Value *byte_stream, llvm::Value *pos, const SQLTypeInfo &ti, CgenState *cgen_state)
const Analyzer::GeoOperator * operator_
std::vector< llvm::Value * > codegen(const std::vector< llvm::Value * > &args, CodeGenerator::NullCheckCodegen *nullcheck_codegen, CgenState *cgen_state, const CompilationOptions &co) final
virtual const Analyzer::Expr * getOperand(const size_t index)
std::string toString() const override