OmniSciDB  72c90bc290
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
spatial_type::PointN Class Reference

#include <PointN.h>

+ Inheritance diagram for spatial_type::PointN:
+ Collaboration diagram for spatial_type::PointN:

Public Member Functions

 PointN (const Analyzer::GeoOperator *geo_operator)
 
std::unique_ptr
< CodeGenerator::NullCheckCodegen
getNullCheckCodegen (llvm::Value *null_lv, CgenState *cgen_state, Executor *executor) final
 
size_t size () const final
 
SQLTypeInfo getNullType () const final
 
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
 
std::vector< llvm::Value * > codegen (const std::vector< llvm::Value * > &args, CodeGenerator::NullCheckCodegen *nullcheck_codegen, CgenState *cgen_state, const CompilationOptions &co) final
 
- Public Member Functions inherited from spatial_type::Codegen
 Codegen (const Analyzer::GeoOperator *geo_operator)
 
auto isNullable () const
 
auto getTypeInfo () const
 
std::string getName () const
 
virtual const Analyzer::ExprgetOperand (const size_t index)
 
virtual ~Codegen ()
 

Additional Inherited Members

- Static Public Member Functions inherited from spatial_type::Codegen
static std::unique_ptr< Codegeninit (const Analyzer::GeoOperator *geo_operator)
 
- Protected Attributes inherited from spatial_type::Codegen
const Analyzer::GeoOperatoroperator_
 
bool is_nullable_ {true}
 

Detailed Description

Definition at line 23 of file PointN.h.

Constructor & Destructor Documentation

spatial_type::PointN::PointN ( const Analyzer::GeoOperator geo_operator)
inline

Definition at line 25 of file PointN.h.

References CHECK_EQ, spatial_type::Codegen::is_nullable_, spatial_type::Codegen::operator_, and Analyzer::GeoOperator::size().

25  : Codegen(geo_operator) {
26  CHECK_EQ(operator_->size(), size_t(2));
27  // set is nullable to true, because an index outside of the linestring will return
28  // null
29  // note we could probably just set this based on the operator type, as the operator
30  // type needs to match
31  this->is_nullable_ = true;
32  }
#define CHECK_EQ(x, y)
Definition: Logger.h:301
const Analyzer::GeoOperator * operator_
Definition: Codegen.h:67
size_t size() const
Definition: Analyzer.cpp:4182
Codegen(const Analyzer::GeoOperator *geo_operator)
Definition: Codegen.h:28

+ Here is the call graph for this function:

Member Function Documentation

std::vector<llvm::Value*> spatial_type::PointN::codegen ( const std::vector< llvm::Value * > &  args,
CodeGenerator::NullCheckCodegen nullcheck_codegen,
CgenState cgen_state,
const CompilationOptions co 
)
inlinefinalvirtual

Implements spatial_type::Codegen.

Definition at line 124 of file PointN.h.

References run_benchmark_import::args, CHECK, CHECK_EQ, and kENCODING_GEOINT.

127  {
128  CHECK_EQ(args.size(), size_t(3)); // ptr, size, index
129  const auto& geo_ti = getOperand(0)->get_type_info();
130  CHECK(geo_ti.is_geometry());
131 
132  llvm::Value* array_buff_cast{nullptr};
133 
134  auto& builder = cgen_state->ir_builder_;
135  if (geo_ti.get_compression() == kENCODING_GEOINT) {
136  array_buff_cast = builder.CreateBitCast(
137  args.front(), llvm::Type::getInt32PtrTy(cgen_state->context_));
138  } else {
139  array_buff_cast = builder.CreateBitCast(
140  args.front(), llvm::Type::getDoublePtrTy(cgen_state->context_));
141  }
142 
143  const auto index_lv = args.back();
144  auto array_offset_lv = builder.CreateGEP(
145  array_buff_cast->getType()->getScalarType()->getPointerElementType(),
146  array_buff_cast,
147  index_lv,
148  operator_->getName() + "_Offset");
149  CHECK(nullcheck_codegen);
150  auto ret_lv = nullcheck_codegen->finalize(
151  llvm::ConstantPointerNull::get(
152  geo_ti.get_compression() == kENCODING_GEOINT
153  ? llvm::PointerType::get(llvm::Type::getInt32Ty(cgen_state->context_), 0)
154  : llvm::PointerType::get(llvm::Type::getDoubleTy(cgen_state->context_),
155  0)),
156  array_offset_lv);
157  const auto geo_size_lv = args[1];
158  return {ret_lv, geo_size_lv};
159  }
#define CHECK_EQ(x, y)
Definition: Logger.h:301
llvm::IRBuilder ir_builder_
Definition: CgenState.h:384
llvm::LLVMContext & context_
Definition: CgenState.h:382
const std::string & getName() const
Definition: Analyzer.h:3167
const SQLTypeInfo & get_type_info() const
Definition: Analyzer.h:79
const Analyzer::GeoOperator * operator_
Definition: Codegen.h:67
llvm::Value * finalize(llvm::Value *null_lv, llvm::Value *notnull_lv)
Definition: IRCodegen.cpp:1529
#define CHECK(condition)
Definition: Logger.h:291
virtual const Analyzer::Expr * getOperand(const size_t index)
Definition: Codegen.cpp:64
std::tuple<std::vector<llvm::Value*>, llvm::Value*> spatial_type::PointN::codegenLoads ( const std::vector< llvm::Value * > &  arg_lvs,
const std::vector< llvm::Value * > &  pos_lvs,
CgenState cgen_state 
)
inlinefinalvirtual

Implements spatial_type::Codegen.

Definition at line 55 of file PointN.h.

References CHECK, CHECK_EQ, get_int_type(), spatial_type::Codegen::getOperand(), kLINESTRING, log2_bytes(), and size().

58  {
59  CHECK_EQ(pos_lvs.size(), size());
60  CHECK_EQ(pos_lvs.front(), pos_lvs.back());
61  auto operand = getOperand(0);
62  CHECK(operand);
63  const auto& geo_ti = operand->get_type_info();
64  CHECK(geo_ti.get_type() == kLINESTRING);
65 
66  auto& builder = cgen_state->ir_builder_;
67 
68  std::vector<llvm::Value*> array_operand_lvs;
69  CHECK(!arg_lvs.empty());
70  auto index_lv = builder.CreateMul(
71  builder.CreateSub(arg_lvs.back(), cgen_state->llInt(static_cast<int32_t>(1))),
72  cgen_state->llInt(static_cast<int32_t>(2)));
73  llvm::Value* is_null_lv{nullptr};
74  if (arg_lvs.size() == 2) {
75  // col byte stream from column on disk
76  array_operand_lvs.push_back(
77  cgen_state->emitExternalCall("array_buff",
78  llvm::Type::getInt8PtrTy(cgen_state->context_),
79  {arg_lvs.front(), pos_lvs.front()}));
80  const bool is_nullable = !geo_ti.get_notnull();
81  std::string size_fn_name = "array_size";
82  if (is_nullable) {
83  size_fn_name += "_nullable";
84  }
85 
86  uint32_t elem_sz = 1; // TINYINT coords array
87  std::vector<llvm::Value*> array_sz_args{
88  arg_lvs.front(), pos_lvs.front(), cgen_state->llInt(log2_bytes(elem_sz))};
89  if (is_nullable) {
90  array_sz_args.push_back(
91  cgen_state->llInt(static_cast<int32_t>(inline_int_null_value<int32_t>())));
92  }
93  array_operand_lvs.push_back(cgen_state->emitExternalCall(
94  size_fn_name, get_int_type(32, cgen_state->context_), array_sz_args));
95 
96  auto geo_size_lv = array_operand_lvs.back();
97  // convert the index to a byte index
98  const auto outside_linestring_bounds_lv = builder.CreateNot(builder.CreateICmp(
99  llvm::ICmpInst::ICMP_SLT,
100  builder.CreateMul(index_lv, cgen_state->llInt(static_cast<int32_t>(8))),
101  geo_size_lv));
102  outside_linestring_bounds_lv->setName("outside_linestring_bounds");
103  const auto input_is_null_lv = builder.CreateICmp(
104  llvm::ICmpInst::ICMP_EQ,
105  geo_size_lv,
106  cgen_state->llInt(static_cast<int32_t>(inline_int_null_value<int32_t>())));
107  input_is_null_lv->setName("input_is_null");
108  is_null_lv = builder.CreateOr(outside_linestring_bounds_lv, input_is_null_lv);
109  } else {
110  CHECK_EQ(arg_lvs.size(), size_t(3)); // ptr, size, index
111  array_operand_lvs.push_back(arg_lvs[0]);
112  array_operand_lvs.push_back(arg_lvs[1]);
113 
114  const auto geo_size_lv = arg_lvs[1];
115  // TODO: bounds indices are 64 bits but should be 32 bits, as array length is
116  // limited to 32 bits
117  is_null_lv = builder.CreateNot(
118  builder.CreateICmp(llvm::ICmpInst::ICMP_SLT, index_lv, geo_size_lv));
119  }
120  array_operand_lvs.push_back(index_lv);
121  return std::make_tuple(array_operand_lvs, is_null_lv);
122  }
#define CHECK_EQ(x, y)
Definition: Logger.h:301
llvm::IRBuilder ir_builder_
Definition: CgenState.h:384
llvm::Type * get_int_type(const int width, llvm::LLVMContext &context)
llvm::LLVMContext & context_
Definition: CgenState.h:382
llvm::Value * emitExternalCall(const std::string &fname, llvm::Type *ret_type, const std::vector< llvm::Value * > args, const std::vector< llvm::Attribute::AttrKind > &fnattrs={}, const bool has_struct_return=false)
Definition: CgenState.cpp:395
size_t size() const final
Definition: PointN.h:47
llvm::ConstantInt * llInt(const T v) const
Definition: CgenState.h:249
#define CHECK(condition)
Definition: Logger.h:291
virtual const Analyzer::Expr * getOperand(const size_t index)
Definition: Codegen.cpp:64
uint32_t log2_bytes(const uint32_t bytes)
Definition: Execute.h:198

+ Here is the call graph for this function:

std::unique_ptr<CodeGenerator::NullCheckCodegen> spatial_type::PointN::getNullCheckCodegen ( llvm::Value *  null_lv,
CgenState cgen_state,
Executor executor 
)
inlinefinalvirtual

Reimplemented from spatial_type::Codegen.

Definition at line 34 of file PointN.h.

References CHECK, spatial_type::Codegen::getName(), getNullType(), and spatial_type::Codegen::isNullable().

37  {
38  if (isNullable()) {
39  CHECK(null_lv);
40  return std::make_unique<CodeGenerator::NullCheckCodegen>(
41  cgen_state, executor, null_lv, getNullType(), getName() + "_nullcheck");
42  } else {
43  return nullptr;
44  }
45  }
SQLTypeInfo getNullType() const final
Definition: PointN.h:49
auto isNullable() const
Definition: Codegen.h:32
#define CHECK(condition)
Definition: Logger.h:291
std::string getName() const
Definition: Codegen.h:36

+ Here is the call graph for this function:

SQLTypeInfo spatial_type::PointN::getNullType ( ) const
inlinefinalvirtual

Implements spatial_type::Codegen.

Definition at line 49 of file PointN.h.

References kBOOLEAN.

Referenced by getNullCheckCodegen().

49  {
50  // nullability is the expression `linestring is null OR size within bounds`
51  return SQLTypeInfo(kBOOLEAN);
52  }

+ Here is the caller graph for this function:

size_t spatial_type::PointN::size ( ) const
inlinefinalvirtual

Implements spatial_type::Codegen.

Definition at line 47 of file PointN.h.

Referenced by codegenLoads().

47 { return 2; }

+ Here is the caller graph for this function:


The documentation for this class was generated from the following file: